﻿// ------------------------------------------------------------------------
// 版权信息
// 版权归重庆虫儿飞科技有限公司所有。
// 所有权利保留。
// 官方网站：https://netokit.com
// 许可证信息
// Neto.Kit 项目主要遵循 MIT 许可证和 Apache 许可证（版本 2.0）进行分发和使用。
// 许可证的完整文本可以在源代码树根目录中的 LICENSE-APACHE 和 LICENSE-MIT 文件中找到。
// 
// 使用条款
// 使用本代码应遵守相关法律法规和许可证的要求。
// 
// 免责声明
// 对于因使用本代码而产生的任何直接、间接、偶然、特殊或后果性损害，我们不承担任何责任。
// 
// 其他重要信息
// Neto.Kit 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。
// 有关 Neto.Kit 项目的其他详细信息，请参阅位于源代码树根目录中的 COPYRIGHT 和 DISCLAIMER 文件。
// 
// 更多信息
// 请访问 https://netokit.com 获取更多关于 Neto.Kit 项目的许可证和版权信息。
// ------------------------------------------------------------------------

#region

using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.Extensions.Hosting;

#endregion

namespace Neto.Web;

/// <summary>
///     MVC错误页面过滤器
/// </summary>
public class ErrorPageFilter : ActionFilterAttribute
{
    /// <summary>
    ///     构造函数
    /// </summary>
    /// <param name="area"></param>
    public ErrorPageFilter(string area)
    {
        Area = area;
    }

    /// <summary>
    ///     区域
    /// </summary>
    public string Area { get; }

    /// <summary>
    /// </summary>
    /// <param name="context"></param>
    /// <param name="next"></param>
    /// <returns></returns>
    public async override Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        //return base.OnActionExecutionAsync(context, next);

        //执行
        var resultContext = await next();

        var contextArea = resultContext.GetAreaName();
        if (contextArea == null) return;
        //跳过400和401
        if (resultContext.HttpContext.Response.StatusCode is 400 or 401) return;

        //不是指定的Area或没有异常 则直接返回
        if (!string.Equals(contextArea, Area, StringComparison.CurrentCultureIgnoreCase) ||
            resultContext.Exception == null) return;
        //如果不是开发环境，则跳转到 ：用户友好的错误页面
        if (App.WebHostEnvironment.IsDevelopment()) return;

        //不是500错误，则直接返回
        if (resultContext.HttpContext.Response.StatusCode is < 500 or > 599) return;

        //context.HttpContext.Response.StatusCode = 500;
        // context.HttpContext.Response.Redirect("/Error");

        // 直接返回错误视图，而不是重定向，以保持状态码500
        context.Result = new ViewResult
        {
            ViewName = "Error",
            ViewData = new ViewDataDictionary(
                new EmptyModelMetadataProvider(),
                new ModelStateDictionary()) { { "ExceptionMessage", resultContext.Exception.Message } }
        };

        //else if (context.HttpContext.Response.StatusCode == 404)
        //{
        //    //context.HttpContext.Response.StatusCode = 404;
        //    context.HttpContext.Response.Redirect("error/404");
        //}
        //else if (context.HttpContext.Response.StatusCode == 400 || context.HttpContext.Response.StatusCode == 401)
        //{
        //    //context.HttpContext.Response.StatusCode = 404;
        //    context.HttpContext.Response.Redirect($"error/{context.HttpContext.Response.StatusCode}");
        //}
    }


    //public override void OnResultExecuted(ResultExecutedContext context)
    //{
    //    if (context.HttpContext.Response.StatusCode == 500)
    //    {
    //        context.HttpContext.Response.Redirect("error/500");
    //    }
    //    else if (context.HttpContext.Response.StatusCode == 500)
    //    {
    //        context.HttpContext.Response.Redirect("error/500");
    //    }
    //    base.OnResultExecuted(context);
    //}
}